package com.leetcode.week.week293;

import java.util.*;

/**
 * @author angzhijin
 * @Description
 * @create 2022-05-15 11:18 上午
 */
public class Week4 {

    public static void main(String[] args) {
        CountIntervals countIntervals = new CountIntervals(); // 用一个区间空集初始化对象
        countIntervals.add(2, 3);  // 将 [2, 3] 添加到区间集合中
        countIntervals.add(7, 10); // 将 [7, 10] 添加到区间集合中
        System.out.println(countIntervals.count());    // 返回 6
        // 整数 2 和 3 出现在区间 [2, 3] 中
        // 整数 7、8、9、10 出现在区间 [7, 10] 中
        countIntervals.add(5, 8);  // 将 [5, 8] 添加到区间集合中
        System.out.println(countIntervals.count());   // 返回 8
        // 整数 2 和 3 出现在区间 [2, 3] 中
        // 整数 5 和 6 出现在区间 [5, 8] 中
        // 整数 7 和 8 出现在区间 [5, 8] 和区间 [7, 10] 中
        // 整数 9 和 10 出现在区间 [7, 10] 中
    }


    static class CountIntervals {
        private List<int[]> list;
        private int sum;

        public CountIntervals() {
            list = new ArrayList<>();
            sum=0;
        }

        public void add(int left, int right) {
            for (int i = list.size()-1; i >=0 ; i--) {
                int[] cur = list.get(i);
                if(cur[0]>=left && cur[1]<=right){ // lr更大
                    list.remove(i);
                    sum-= cur[1] - cur[0] +1;
                }else if (cur[0]<=left && cur[1]>=right){ // lr已在内
                    return;
                }else if (left>=cur[0] && left <= cur[1]){
                    left = cur[0];
                    list.remove(i);
                    sum-= cur[1] - cur[0] +1;
                }else if(right>=cur[0] && right <= cur[1]){
                    right = cur[1];
                    list.remove(i);
                    sum-= cur[1] - cur[0] +1;
                }
            }
            list.add(new int[]{left, right});
            sum+= left-right+1;
            Collections.sort(list, (o1, o2) -> {
                if (o1[0]-o2[0]==0) return o1[1]-o2[1];
                return o1[0]-o2[0];
            });
        }

        public int count() {
            int count = 0;
            for (int[] item :
                    list) {
                count += item[1] - item[0]+1;
            }
            return count;
        }
    }

}
